/**
 * @desc 给原始数组中数据按指定位置分别分组
 * @param arrays
 * @returns {*[][]}
 */
const zip = (...arrays) => {
	// 使用 Math.max(), Function.prototype.apply() 获取参数中最长的数组。
	const maxLength = Math.max(...arrays.map(x => x.length));
	// Array.from() 创建一个个数组
	return Array.from({ length: maxLength }).map((_, i) => {
		// 最终返回二维数组
		return Array.from({ length: arrays.length }, (_, k) => arrays[k][i]);
	});
};
// 例子
zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]

/**
 * @desc 给原始数组按指定位置解除分组
 * @param arr
 * @returns {*}
 */
const unzip = arr =>
	// 使用 Array.prototype.reduce() 和 Array.prototype.forEach() 将分组值映射到单个数组。
	arr.reduce(
		(acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
		// 使用 Math.max(), Function.prototype.apply() 获取数组中最长的子数组
		// 初始化二维数组
		Array.from({length: Math.max(...arr.map(x => x.length))}).map(x => [])
	);

// 例子
unzip([['a', 1, true], ['b', 2, false]]); // [['a', 'b'], [1, 2], [true, false]]
unzip([['a', 1, true], ['b', 2]]); // [['a', 'b'], [1, 2], [true]]
